package cn.zwx.learn.spring.orm.core.common;


import cn.zwx.learn.spring.orm.core.framework.QueryRule;
import cn.zwx.learn.spring.orm.core.utils.Page;

import java.util.List;
import java.util.Map;

/**
 * @author zhangwenxue
 */
public interface BaseMapper<T,PK> {
     /**
      * 获取列表
      * @param queryRule 查询请求参数
      * @author zhangwenxue
      * @date 2022/5/4 17:21
      * @return List<T> 返回结果集合
      * @throws Exception 业务异常
     */
    List<T> select(QueryRule queryRule) throws Exception;

    /**
     * 获取分页结果
     * @param queryRule 查询条件
     * @param pageNo 页码
     * @param pageSize 每页条数
     * @author zhangwenxue
     * @date 2022/5/4 17:21
     * @return Page<?> 返回结果集合
     * @throws Exception 业务异常
     */
    Page<?> select(QueryRule queryRule, int pageNo, int pageSize) throws Exception;
    /**
     * 根据SQL获取列表
     * @param sql SQL语句
     * @param args 参数
     * @author zhangwenxue
     * @date 2022/5/4 17:21
     * @return List<Map<String,Object>> 返回结果集合
     * @throws Exception 业务异常
     */
    List<Map<String,Object>> selectBySql(String sql, Object... args) throws Exception;

    /**
     * 根据SQL获取分页
     * @param sql SQL语句
     * @param param 参数集合
     * @param pageNo 页码
     * @param pageSize 每页条数
     * @author zhangwenxue
     * @date 2022/5/4 17:21
     * @return Page<Map<String,Object>> 返回结果集合
     * @throws Exception 业务异常
     */
    Page<Map<String,Object>> selectBySqlToPage(String sql, Object [] param, int pageNo, int pageSize) throws Exception;

    /**
     * 删除一条记录
     * @param entity entity中的ID不能为空，如果ID为空，其他条件不能为空，都为空不予执行
     * @author zhangwenxue
     * @date 2022/5/4 17:21
     * @return int 返回影响行数
     * @throws Exception 业务异常
     */
    boolean delete(T entity) throws Exception;

    /**
     * 批量删除
     * @param list 批量根根据PO对象删除
     * @author zhangwenxue
     * @date 2022/5/4 17:21
     * @return int 返回影响行数
     * @throws Exception 业务异常
     */
    int deleteAll(List<T> list) throws Exception;

    /**
     * 插入一条记录并返回插入后的ID
     * @param entity 只要entity不等于null，就执行插入
     * @author zhangwenxue
     * @date 2022/5/4 17:21
     * @return PK 主键ID
     * @throws Exception 业务异常
     */
    PK insertAndReturnId(T entity) throws Exception;

    /**
     * 插入一条记录自增ID
     * @param entity 只要entity不等于null，就执行插入
     * @author zhangwenxue
     * @date 2022/5/4 17:21
     * @return boolean 是否插入成功
     * @throws Exception 业务异常
     */
    boolean insert(T entity) throws Exception;

    /**
     * 批量插入
     * @param list 只要list不等于null，就执行插入
     * @author zhangwenxue
     * @date 2022/5/4 17:21
     * @return int 返回受影响的行数
     * @throws Exception 业务异常
     */
    int insertAll(List<T> list) throws Exception;

    /**
     * 修改一条记录
     * @param entity entity中的ID不能为空，如果ID为空，其他条件不能为空，都为空不予执行
     * @author zhangwenxue
     * @date 2022/5/4 17:21
     * @return boolean 是否修改成功
     * @throws Exception 业务异常
     */
    boolean update(T entity) throws Exception;

}
